package com.bf.electroplating.util;


import io.minio.*;
import io.minio.http.Method;
import jakarta.annotation.Resource;
import lombok.Setter;
import lombok.SneakyThrows;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

/**
 * minio操作类
 */
@Component
@Setter ( onMethod_ = @Resource)
public class MinioUtils {


	private MinioClient minioClient;
	/**
	 * 获取文件信息
	 *
	 * @param bucketName 桶名称
	 * @param objectName 文件名称
	 */
	@SneakyThrows ( Exception.class )
	public StatObjectResponse getObjectInfo( String bucketName , String objectName ) {
        try {
            return minioClient.statObject( StatObjectArgs.builder().bucket( bucketName ).object( objectName ).build() );
        }catch (Exception e) {
            return null;
        }
	}
	/**
	 * 上传文件
	 *
	 * @param bucketName 桶名称
	 * @param objectName 文件名
	 * @param stream 流
	 * @param fileSize 文件大小
	 * @param type 文件类型
	 */
	@SneakyThrows ( Exception.class )
	public void putObject( String bucketName , String objectName , InputStream stream , Long fileSize , String type ) {
		 minioClient.putObject( PutObjectArgs.builder().bucket( bucketName ).object( objectName ).stream( stream , fileSize
				, 10485760 ).contentType( type ).build() );
	}
	/**
	 * 创建文件夹
	 *
	 * @param bucketName 桶名称
	 * @param path 路径
	 */
	@SneakyThrows ( Exception.class )
	public void createFolder( String bucketName , String path ) {
		 minioClient.putObject( PutObjectArgs.builder().bucket( bucketName ).object( path ).stream( new ByteArrayInputStream( new byte[] {} ) , 0 , - 1 ).build() );
	}
	/**
	 * 获取文件在minio在服务器上的外链
	 *
	 * @param bucketName 桶名称
	 * @param objectName 文件名
	 */
	@SneakyThrows ( Exception.class )
	public String getObjectUrl( String bucketName , String objectName ) {
        try {
            return  minioClient.getPresignedObjectUrl( GetPresignedObjectUrlArgs.builder().method( Method.GET ).bucket( bucketName ).object( objectName ).build() );
        }catch (Exception e) {
            return  "";
        }
	}
	/**
	 * 删除文件
	 *
	 * @param bucketName 桶名称
	 * @param objectName 文件名称
	 */
	@SneakyThrows ( Exception.class )
	public void removeObject( String bucketName , String objectName ) {
		 minioClient.removeObject( RemoveObjectArgs.builder().bucket( bucketName ).object( objectName ).build() );
	}
	/**
	 * 获取文件流
	 *
	 * @param bucketName bucket名称
	 * @param objectName 文件名称
	 * @return 二进制流
	 */
	@SneakyThrows ( Exception.class )
	public GetObjectResponse getFileStream( String bucketName , String objectName ) {
        try {

            return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
        }catch (Exception e) {
            return null;
        }
	}

}
